package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"go-xorm-01/utils"
	"time"
	"xorm.io/xorm"
	"xorm.io/xorm/log"
	"xorm.io/xorm/names"
)

var engine *xorm.Engine

// 插入数据 # https://xorm.io/zh/docs/chapter-04/readme/
// 插入数据使用Insert方法，Insert方法的参数可以是一个或多个Struct的指针，一个或多个Struct的Slice的指针。
//
// 如果传入的是Slice并且当数据库支持批量插入时，Insert会使用批量插入的方式进行插入。
func main() {
	SnakeMapper()
	//insertOneUser(engine)
	insetManyUser(engine)
	defer engine.Close()
}

// insertOneUser
//
//	@Description: 插入一条(推荐使用指针)
//	@param engine
func insertOneUser(engine *xorm.Engine) {
	var u *UserInsert = &UserInsert{
		Username:      "zhangsan-01",
		Password:      "123456",
		RegisterTime:  time.Now(),
		LastLoginTime: time.Now()}
	insert, err := engine.Insert(u)
	if err != nil {
		fmt.Printf("insert err:%v", err)
	}
	fmt.Println(insert)
	fmt.Printf("id= %d", (*u).Id)

}

func insetManyUser(engine *xorm.Engine) {
	users := make([]*UserInsert, 0)
	for i := 0; i < 5; i++ {
		users = append(users, &UserInsert{
			Username:      fmt.Sprintf("zhangsan-%d", i),
			Password:      fmt.Sprintf("123456-%d", i),
			RegisterTime:  time.Now(),
			LastLoginTime: time.Now(),
		})
	}
	insert, err := engine.Insert(users)
	if err != nil {
		fmt.Printf("insert err:%v", err)
	}
	fmt.Println(insert)
	for i, _ := range users {
		fmt.Printf("id= %d \n,", (*users[i]).Id)
	}
}

// SnakeMapper
//
//	@Description: SnakeMapper支持struct为驼峰式命名，表结构为下划线命名之间的转换，这个是默认的Mapper
func SnakeMapper() {
	engine = utils.GenerateEngine()
	engine.SetMapper(names.SnakeMapper{}) // SnakeMapper 【默认】
	engine.Sync2(new(UserInsert))
	engine.ShowSQL(true)
	engine.SetLogLevel(log.LOG_DEBUG)

}

// UserInsert
// @Description: UserInsert
type UserInsert struct {
	Id            int64 `xorm:"pk autoincr"` //指定列名 ，默认id
	Username      string
	Password      string
	RegisterTime  time.Time
	LastLoginTime time.Time
}

// TableName
//
//	@Description: 指定表名：默认为:user_insert
//	@receiver u
//	@return string
func (u UserInsert) TableName() string {
	return "user_insert"
}
